//
//  ViewController.m
//  25-GCD
//
//  Created by dllo on 16/8/17.
//  Copyright © 2016年 dllo. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()
@property (nonatomic,strong) UIImage *image;
@property (nonatomic,strong) UIImageView *photoImageView;

@property (weak, nonatomic) IBOutlet UIImageView *imageView;


@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
//    NSAssert(_image, @"Image not set; required to use view controller");
//    _photoImageView.image = _image;
//    if (_image.size.height <= _photoImageView.bounds.size.height && _image.size.width <= _photoImageView.bounds.size.width) {
//        [_photoImageView setContentMode:UIViewContentModeCenter];
//    }
//    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH , 0), ^{
//    });

//    1.gcd grand Centeral(中央的)dispatch(调度)
//    2.核心概念 队列
//    3.任务拆分分配到队列中，系统会自动为我们创建线程和调度线程，自动
//    队列严格遵循FIFO(先进先出)
//    1.串行DISPATCH_QUEUE_SERIAL
//    2.并发DISPATCH_QUEUE_CONCURRENT
//4.队列的创建
//    队列的名字
//    队列的类型
//    自己创建的队列
 dispatch_queue_t serialQueue = dispatch_queue_create("serialQueue", DISPATCH_QUEUE_SERIAL);
    
    dispatch_queue_t concurrentQueue = dispatch_queue_create("concurrentQueue", DISPATCH_QUEUE_CONCURRENT);
//    系统提供的队列
//    主队列，串行
    dispatch_queue_t mainQueue = dispatch_get_main_queue();
//    全局队列，并发
//    参数1：调度队列优先级
//    参数2：给未来使用，占位使用，添0
    dispatch_queue_t global = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//    术语
//    串行
//    一个任务执行完毕再执行下一个
//    并行
//    多个任务同时执行
//    同步
//    在当前线程去执行任务，不能开辟线程
//    异步 
//    在新的线程执行任务，可以开辟线程
    
//    5同步异步
    
//    [self syncSerialQueue:serialQueue];
////    同步并行，不会创建线程
//    [self syncCurrentQueue:concurrentQueue];
////    主线程等待同步操作结束，同步操作在主线程中执行，互相等待，导致程序卡死
//    [self syncmainQueue:mainQueue];
////    不会创建主线程
//    [self syncglobal:global];
//    
////    创建一条新的线程，在该线程中执行任务
//    [self asyncSerialQueue:serialQueue];
    
//   并发队列 根据任务决定需要创建多少线程
//    不创建新的线程，在主线程中执行任务
//    创建新的线程，根据任务决定需要创建多少线程
    
//    异步主线程队列
    
//    同步串行队列
//    dispatch_sync(serialQueue, ^{
//        for (int i = 0; i < 10; i++) {
//            
//            NSLog(@"%d---%@",i,[NSThread currentThread]);
//        }
//    });
//    同步并行队列
//    dispatch_sync(concurrentQueue, ^{
//        for (int i = 0; i < 10; i++) {
//            
//            NSLog(@"%d---%@",i,[NSThread currentThread]);
//        }
//    });
    
//    同步主线程队列
//    主线程同步主线程
//    主线程等待同步操作结束，同步操作在主线程执行，互相等待，导致程序卡死
//    dispatch_sync(mainQueue, ^{
//        for (int i = 0; i < 10; i++) {
//            
//            NSLog(@"%d---%@",i,[NSThread currentThread]);
//        }
//    });
//    同步全局队列
//    dispatch_sync(global, ^{
//        for (int i = 0; i < 10; i++) {
//            NSLog(@"%d---%@",i,[NSThread currentThread]);
//        }
//    });
    
    
    
    
    
    
//    dispatch_async(serialQueue, ^{
//        for (int i = 0; i < 10; i++) {
//            
//            NSLog(@"%d---%@",i,[NSThread currentThread]);
//        }
//    });
    //    同步并行队列
//    dispatch_async(concurrentQueue, ^{
//        for (int i = 0; i < 10; i++) {
//            
//            NSLog(@"%d---%@",i,[NSThread currentThread]);
//        }
//    });

    
    
//    dispatch_async(mainQueue, ^{
//        for (int i = 0; i < 10; i++) {
//            
//            NSLog(@"%d---%@",i,[NSThread currentThread]);
//        }
//    });
    //    同步全局队列
//    dispatch_async(global, ^{
//        for (int i = 0; i < 10; i++) {
//            NSLog(@"%d---%@",i,[NSThread currentThread]);
//        }
//    });

    
    
//    6.组的创建
dispatch_group_t group = dispatch_group_create();
    
    
    dispatch_group_async(group, serialQueue, ^{
        NSLog(@"group1-------%@",[NSThread currentThread]);
    });
    
    dispatch_group_async(group, concurrentQueue, ^{
        NSLog(@"group2-------%@",[NSThread currentThread]);
    });
    
    dispatch_group_async(group, global, ^{
        NSLog(@"group3-------%@",[NSThread currentThread]);
    });
//    所有任务都执行完毕，会调用下列方法
    dispatch_group_notify(group, mainQueue, ^{
//        NSLog(@"所有操作完成时，执行后续操作 刷新");
    });
    
    
    
    
    

    
    
    
    
    
    [self loadImage];
    
    
    
    
    
    
    
}

- (void)loadImage
{
   dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    NSURL *imageURL = [NSURL URLWithString:@"http://pic1.win4000.com/wallpaper/8/511ce1c9ee276.jpg"];
//       NSLog(@"%@",imageURL);
    NSData *data = [NSData dataWithContentsOfURL:imageURL];
//    NSLog(@"%@",data);
//       返回主线程刷新UI
       dispatch_async(dispatch_get_main_queue(), ^{
           
    _imageView.image = [UIImage imageWithData:data];
       });
   });
    
    
}







//异步串行队列，创建一个新的线程，在该线程中执行
- (void)asyncSerialQueue:(dispatch_queue_t)serialQueue
{
    //    block中的内容会追加到队列中
        NSLog(@"异步串行队列执行任务");
    for (int i = 0; i < 10; i++) {
        dispatch_async(serialQueue, ^{
            NSLog(@"%d---%@",i,[NSThread currentThread]);
        });
    }
}







- (void)syncSerialQueue:(dispatch_queue_t)serialQueue
{
//    block中的内容会追加到队列中
    NSLog(@"同步串行队列执行任务");
        for (int i = 0; i < 10; i++) {
            dispatch_sync(serialQueue, ^{
                NSLog(@"%d---%@",i,[NSThread currentThread]);
            });
        }
}

- (void)syncCurrentQueue:(dispatch_queue_t)currentQueue
{
        NSLog(@"同步主线程队列执行任务");
    for (int i = 0; i < 10; i++) {
        dispatch_sync(currentQueue, ^{
            NSLog(@"%d---%@",i,[NSThread currentThread]);
        });
    }

}

- (void)syncmainQueue:(dispatch_queue_t)syncmainQueue
{
        NSLog(@"同步全局队列执行任务");
    for (int i = 0; i < 10; i++) {
        dispatch_sync(syncmainQueue, ^{
            NSLog(@"%d---%@",i,[NSThread currentThread]);
        });
    }
}

- (void)syncglobal:(dispatch_queue_t)global
{
        NSLog(@"同步串行队列执行任务");
    for (int i = 0; i < 10; i++) {
        dispatch_sync(global, ^{
            NSLog(@"%d---%@",i,[NSThread currentThread]);
        });
    }
}



- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end
